#include <stdio.h>
#include <graphics.h>
#include <stdlib.h>
#include <conio.h>
#include <windows.h>
#define  high 600//画面尺寸
#define  width 350 
#define  bar_num 2 //障碍数量

// 全局变量
int bird_x,bird_y; // 小鸟位置 
int score; // 得分
int barup_left[2],barup_right[2],barup_bottom[2],bardown_top[2],bardown_left[2],bardown_right[2]; //障碍物
int bar_kong;//障碍小孔大小
int bar_width; //障碍宽度
int bird_speed;
int down_time=0; //记录小鸟持续下落时间





void startup() // 数据初始化
{
	//初始化小鸟位置
	bird_x=	100;
	bird_y=high/3;

	//初始化障碍
	bar_kong=180;
	bar_width=140;
	barup_left[0]=width-100;
	barup_left[1]=width-100+300;//两个障碍之间相聚300 
	int k;
	for(k=0 ; k<bar_num ; k++){
		barup_right[k]=barup_left[k]+bar_width;

		barup_bottom[k]=rand()%(high-bar_kong-150)+150;
		bardown_top[k]=barup_bottom[k]+bar_kong;

		bardown_left[k]=barup_left[k];
		bardown_right[k]=barup_right[k];
	}
	
	
	score = 0;
	bird_speed=1;


	initgraph(width,high); //画布尺寸

	BeginBatchDraw();  //开始绘图
}


void show()  // 显示画面
{
	//游戏背景
	IMAGE biejing ;  //定义 IMAGE 对象
	loadimage(&biejing,"D:\\background.jpg");   //读取图片到 beijing 
	putimage(0,0,&biejing ); //在坐标0,0位置显示 beijing 对应的图像(整个输出）
                              //(和绘制不一样，无需清屏）
	//小鸟图像
	IMAGE bird1, bird2;
	loadimage(&bird1,"D:\\bird1.jpg");
	loadimage(&bird2,"D:\\bird2.jpg");
	putimage(bird_x,bird_y,&bird1,NOTSRCERASE);
	putimage(bird_x,bird_y,&bird2,SRCINVERT); 

	//障碍物图像
	int k;
	for(k=0;k<bar_num;k++){
	IMAGE bar1,bar2;
	loadimage(&bar1,"D:\\bar_up2.gif");
	loadimage(&bar2,"D:\\bar_down2.gif");
	putimage(barup_left[k],0,bar_width,barup_bottom[k],&bar1,0,600-barup_bottom[k]); //选择性输出图片(输出坐标位置x y,输出的宽高,图片,图片起始坐标位置）
	putimage(barup_left[k],barup_bottom[k]+bar_kong,bar_width,600-barup_bottom[k]-bar_kong,&bar2,0,0); 
	}

	
	FlushBatchDraw();  //批量绘图

}	

void gameover() //游戏结束后
{
	system("pause");
}

void updateWithoutInput()  // 与用户输入无关的更新
{	
	if(bird_y<high){
		//小鸟下落
		bird_y+=bird_speed;
		down_time++;
	}

	if(down_time%10==0){ 
		//每隔一段时间小鸟加速
		if(bird_speed<2){  //限制小鸟最大下落速度
				bird_speed++;
		}
		down_time=0;
	}
	
	int k;
	for(k=0;k<bar_num;k++){
	if(barup_left[k]>-bar_width){
		//障碍向左移动
		barup_left[k]--;
		barup_right[k]--;
	}
	else{ //生成新的障碍
		barup_bottom[k]=rand()%(high-bar_kong-150)+150;
		if(k==0){
			barup_left[k]=barup_left[1]+300;
		}
		else{
			barup_left[k]=barup_left[0]+300;
		}
		barup_right[k]=barup_left[k]+bar_width;
		bardown_top[k]=barup_bottom[k]+bar_kong;
		bardown_left[k]=barup_left[k];
		bardown_right[k]=bardown_left[k]+bar_width;
	}
	
	//判断得分与否 
	if(bird_x>=barup_left[k] && bird_x<= barup_right[k]){
		if(bird_y<=barup_bottom[k] || bird_y>=barup_bottom[k]+bar_kong){
			gameover();
		}
		else if(bird_y == (barup_left[k]+barup_right[k])/2){
			score++;
		}
	}

	}

	//小鸟撞到障碍
	
}

void updateWithInput()  // 与用户输入有关的更新
{
	char a;
	if(kbhit()){
		a=getch();//玩家输入 
		if(a==' '){
			//小鸟上飞
			bird_y-=50;

			bird_speed=1; //重置小鸟下落速度
		}
	}
}



int main()
{
	startup();  // 数据初始化	
	while (1) //  游戏循环执行
	{
		show();  // 显示画面
		void clean();  //清楚上一争画面
		updateWithoutInput();  // 与用户输入无关的更新
		updateWithInput();  // 与用户输入有关的更新
	}
	return 0;
}